在連續兩天的減重之後,今天來看看 controller 瘦身後的結果吧 (聽起來好像賣膏藥的 XD)! 進入正題之前特別說明一下, controller 中的每一個 function 都是一個完整運作一套商業邏輯的地方,簡單來說一個 API 就是對應一個 controller 中的 function。
最基本的 controller 可以在 cmd 中執行下面指令產出:
php artisan make:controller <controller 名稱>
預設的 controller 很單純、只繼承 App\Http\Controller
而已
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
//
}
接著我們接續前兩天更新 post 的範例,補完一個 api 基本會有的所有邏輯吧!
public function editPost()
{
}
接著我們規劃一下,幾乎所有的功能都有下列步驟
我們逐步撰寫完成後的結果如下。
__construct
中注入。至於 request 的部分會在明後天 FormRequest
有更詳細的說明。validation
有更詳細的說明。 use Illuminate\Http\Request;
// 01. DI 傳入 request 和 service 等資料
function edit(PostService $postService, Request $request)
{
// 02. 檢查、過濾 request
// 例如,必須要有呼叫 api 的使用者 ID、要修改的 post ID 以及其他必要的資料
$validUserId = $request->has('userId') && is_int($request['userId']);
$validPostId = $request->has('postId') && is_int($request['postId']);
$hasTitle = $request->has('title');
$hasContent = $request->has('content');
// 其中一個不合法就回傳 http status 設為 422 的 response
if (!$validUserId || !$validPostId || !$hasTitle || !$hasContent) {
return response()->json([
'success' => false,
'message' => 'bad request data'
], 422);
}
// 03. 資料前處理
$updateData = $request->only(['title', 'content']);
// 04. 執行 service
try {
// 更新 post 資料並取回新的 post 結果
$updatedPost = $postService->updatePost($request['userId'], $request['postId'], $updateData);
// 將 post model 轉換為 api resource 形式
$updatedPost = $postService->modelToAPIResource(updatedPost);
// 05. 回傳成功結果
return response()->json([
'success' => true,
'message' => null,
'data' => $updatedPost
]);
} catch (\Exception $exception) {
// 05. 回傳執行過程中出現錯誤的資訊
$exMessage = $exception.getMessage();
$exCode = $exception.getCode();
return response()->json([
'success' => false,
'message' => "catch exception:{$exMessage}",
'code' => $exCode,
], 500);
}
}
在有了 service 和 repository 之後,controller 輕量很多、易寫也好讀,不過我們在上面的範例看到 request 驗證的部分就占很重,但又不能省略...,好在 Laravel 有提供開發者方便驗證的作法,我們就於明後兩天分別介紹 FormRequest
和 validation
把 controller 的工作再分散出去,讓日後更好維護吧!